<?php

namespace Modules\Api\Controllers;

use Lib\Response;
use Phalcon\Mvc\Controller;
use Phalcon\Mvc\View;
use Phalcon\Di;

class ControllerBase extends Controller {

    public function initialize() {
//        if (!$this->request->isPost()) {
//            return Response::errmsg('请使用POST方式传参', 10000111);
//        }

        //$this->view->setTemplateAfter('default');
        //$this->view->setTemplateBefore('default');
        //$config    = Di::getDefault()->get('config');
//        $staticUrl = $this->config->application->frontStaticUrl;
//        $fileUrl   = $this->config->application->fileStaticUrl;
//        $this->view->setVar("staticUrl", $staticUrl);
//        $this->view->setVar("fileUrl", $fileUrl);
    }

    /**
     * @desc 关闭模板的默认渲染设置--生成显示到控制器布局。
     *
     * @return bool
     */
    public function disableView() {
        $this->view->disableLevel(View::LEVEL_LAYOUT);
    }

    /**
     * @desc 关闭模板布局--生成显示到主布局。文件： views/index.phtml
     */
    public function disableLayout() {
        $this->view->disableLevel(View::LEVEL_MAIN_LAYOUT);
    }

    public function disableRender() {
        // Disable the view to avoid rendering 关闭渲染
        $this->view->disable();
    }

    //public static function findBySql($model, $sql) {
    //    return new \Phalcon\Mvc\Model\Resultset\Simple(null, $model, $model->getReadConnection()->query($sql));
    //}

    /**
     * @param     $data
     * @param int $code
     * @return string
     */
    public function returnJson($data, $code = 200) {
        $return['code'] = $code;

        if (!empty($data) && is_array($data)) {
            $return['data'] = $data;
        }

        return $this->response->setJsonContent($return, JSON_UNESCAPED_UNICODE);
    }

    public function response($data, $status = true, $code = 200, $msg = null) {
        //$callback = $this->request->get('callback', null);
        $callback = "";

        if (empty($callback)) {
            return $status ? \Lib\Response::data($data, $msg, $code) : \Lib\Response::error($data ? : $msg, $code);
        }

        $resource = [
            'status' => $status,
            'code'   => (int)$code,
            'msg'    => $msg,
        ];

        $resource['data'] = is_array($data)
            ? $data
            : ($data instanceof \Models\AbstractModel ? $data->toArray() : (string)$data);

        return \Lib\Response::callback($resource, $callback);
    }

    //protected function wxredirect($code) {
    //    if(isset($_SERVER['HTTP_REFERER'])) {
    //        $this->getSession()->set('Referer', $_SERVER['HTTP_REFERER']);
    //    }
    //
    //    $this->response(null, false, $code);
    //    exit();
    //}


    /*
    ### 以下代码废弃
    public static function findBySql($model, $sql) {
        return new \Phalcon\Mvc\Model\Resultset\Simple(null, $model, $model->getReadConnection()->query($sql));
    }
    public static function sqlsrv() {
#        require(APP_PATH . '/apps/library/MssqlPdo.class.php');

        try {
            $connection = new \MssqlPdo(array(
                'pdoType' => 'SQLSRV',
                'driver' => 'SQLSRV', // Optional - for when 'pdoType' is 'ODBC'
                'host' => '172.28.93.94',
                'failover' => 'your_server_failover', // Optional
                'port' => '1433',
                'username' => 'sc_dsj',
                'password' => 'S!cD@S4j$TYUui',
                'dbname' => 'SCNZ_DB'
            ));

            return $connection;
//            $arrayResult = $connection->fetchAll("SELECT @@VERSION", \Phalcon\Db::FETCH_NUM);
//            $arrayResult = $this->sqlsrv()->fetchAll($sql, \Phalcon\Db::FETCH_NAMED);
//            var_dump($arrayResult);
//            die();
        } catch (\Phalcon\Db\Exception $e) {
            echo 'Error: ' . $e->getMessage() . '. Line:' . $e->getLine() . '. File:' . $e->getFile(), PHP_EOL;
        }
    }
    public static function executeSql($sql) {
        return self::sqlsrv()->fetchAll($sql, \Phalcon\Db::FETCH_NAMED);
    }
     */

    /**
     * @desc 获取get参数
     * @param string $name 参数名
     * @param string|array $filter 过滤类型，支持string、trim、absint、int、email、float、int!、float!、alphanum、striptags、lower、upper、url、special_chars
     * 当为false时，不使用默认过滤，当为字符串例如'string,trim'时采用参数过滤 ，当为数组例如['string','trim']时采用参数+默认过滤，当为null等其他值时时采用默认过滤
     * @param mixed $defaultValue 默认值
     * @param bool $noRecursive 不递归过滤（即$data不作为数组循环过滤）
     * @return mixed
     * @author zhaoyang
     * @date 2018年5月8日 下午10:38:50
     */
    final protected function get(string $name = null, $filter = null, $defaultValue = null, bool $noRecursive = false)
    {
        $data = array_merge($this->request->getQuery(), $this->dispatcher->getParams());
        unset($data['_url']);
        return $this->sanitize($data, $name, $filter, $defaultValue, $noRecursive);
    }

    /**
     * @desc 获取post参数
     * @param string $name 参数名
     * @param string|array $filter 过滤类型，支持string、trim、absint、int、email、float、int!、float!、alphanum、striptags、lower、upper、url、special_chars
     * 当为false时，不使用默认过滤，当为字符串'string,trim'时采用参数过滤 ，当为数组['string','trim']时采用参数+默认过滤，当为null等其他值时时采用默认过滤
     * @param mixed $defaultValue 默认值
     * @param bool $noRecursive 不递归过滤（即$data不作为数组循环过滤）
     * @return mixed
     * @author zhaoyang
     * @date 2018年5月9日 下午8:40:27
     */
    final protected function post(string $name = null, $filter = null, $defaultValue = null, bool $noRecursive = false)
    {
        $data = $this->request->getPost();
        return $this->sanitize($data, $name, $filter, $defaultValue, $noRecursive);
    }

    /**
     * @desc 获取post或者get参数
     * @param string $name 参数名
     * @param string|array $filter 过滤类型，支持string、trim、absint、int、email、float、int!、float!、alphanum、striptags、lower、upper、url、special_chars
     * 当为false时，不使用默认过滤，当为字符串例如'string,trim'时采用参数过滤 ，当为数组例如['string','trim']时采用参数+默认过滤，当为null等其他值时时采用默认过滤
     * @param mixed $defaultValue 默认值
     * @param bool $noRecursive 不递归过滤（即$data不作为数组循环过滤）
     * @return mixed
     * @author zhaoyang
     * @date 2018年5月9日 下午9:41:49
     */
    final protected function request(string $name = null, $filter = null, $defaultValue = null, bool $noRecursive = false)
    {
        if (isset($name) && $name !== '') {
            return $this->post($name, $filter, $defaultValue, $noRecursive) ?? $this->get($name, $filter, $defaultValue, $noRecursive);
        }
        return array_merge($this->post(null, $filter, $defaultValue, $noRecursive), $this->get(null, $filter, $defaultValue, $noRecursive));
    }

    /**
     * @param string $name 参数名
     * @param string|array $filter 过滤类型，支持string、trim、absint、int、email、float、int!、float!、alphanum、striptags、lower、upper、url、special_chars
     * 当为false时，不使用默认过滤，当为字符串例如'string,trim'时采用参数过滤 ，当为数组例如['string','trim']时采用参数+默认过滤，当为null等其他值时时采用默认过滤
     * @param mixed $defaultValue 默认值
     * @param bool $noRecursive 不递归过滤（即$data不作为数组循环过滤）
     * @return mixed
     * @author zhaoyang
     * @date 2018年5月9日 下午10:43:11
     */
    final protected function json(string $name = null, $filter = null, $defaultValue = null, bool $noRecursive = null)
    {
        $data = $this->request->getJsonRawBody(true);
        if (!is_array($data)) {
            return [];
        }
        return $this->sanitize($data, $name, $filter, $defaultValue, $noRecursive);
    }

    /**
     * @param array $data 数据源
     * @param string $name 参数名
     * @param string|array $filter 过滤类型，支持string、trim、absint、int、email、float、int!、float!、alphanum、striptags、lower、upper、url、special_chars
     * 当为false时，不使用默认过滤，当为字符串例如'string,trim'时采用参数过滤 ，当为数组例如['string','trim']时采用参数+默认过滤，当为null等其他值时时采用默认过滤
     * @param mixed $defaultValue 默认值
     * @param bool $noRecursive 不递归过滤（即$data不作为数组循环过滤）
     * @return mixed
     * @author zhaoyang
     * @date 2018年5月9日 下午8:20:15
     */
    final protected function sanitize(array $data, string $name = null, $filter = null, $defaultValue = null, bool $noRecursive=null)

    {
        $nowFilter = null;
        if (is_string($filter) && !empty($filter)) {
            $nowFilter = explode(',', $filter);
        } else if ($filter !== false) {
//            $defaultFilter = $this->config->services->filter->default_filter;
            $defaultFilter = isset($defaultFilter) ? explode(',', $defaultFilter) : [];
            if (is_array($filter)) {
                $defaultFilter = array_unique(array_merge($filter, $defaultFilter));
            }
            if (!empty($defaultFilter)) {
                $nowFilter = $defaultFilter;
            }
        }
        if (isset($name) && $name !== '') {
            if (isset($data[$name]) && $data[$name] !== '') {
                $data = $data[$name];
            } else {
                $data = $defaultValue;
            }
        }
        if (isset($nowFilter)) {
            if (is_array($data)) {
                foreach ($data as $k => $v) {
                    $data[$k] = is_array($v) ? $this->sanitize($data[$k], null, $filter, $defaultValue, $noRecursive) : $this->filter->sanitize($data[$k], $nowFilter, $noRecursive);
                }
            } else {
                $data = $this->filter->sanitize($data, $nowFilter, $noRecursive);
            }
        }
        return $data;
    }




}
